package search

import (
	"log"
	"sync"
)

var matchers = make(map[string]matchers)

//执行搜索逻辑
func Run(SearchTerm string) {
	//获取需要搜索的数据源列表
	feeds, err := RetrieveFeeds()
	if err != nil {
		log.Fatal(err)
	}
	//创建一个无缓冲的通道,接收匹配后的结果
	results := make(chan *Result)
	//构造一个waitgroup,以便处理所有的数据源
	var waitGroup sync.WaitGroup
	//设置需要等待处理每个数据源的goroutine的数量
	waitGroup.Add(len(feeds))
	//为每一个数据源启动一个goroutine 来查找结果
	for _, feed := range feeds {
		//获取一个匹配器用于查找
		matchers, exists := matchers[feed.Type]
		if !exists {
			matchers = matchers["default"]
		}
		//启动一个goroutine 来执行搜索
		go func(matcher Matcher, feed *Feed) {
			Match(matcher, feed, SearchTerm, results)
			waitGroup.Done()
		}(matcher, feed)
	}

	go func() {
		//等待所有任务完成
		waitGroup.Wait()
		//用关闭通道的方式,通知display函数可以退出程序了
		close(results)
	}()

	//启动函数,显示返回的结果,并且在最后一个结果显示完成后返回
	Display(results)
}
